import { initRender } from './render'
import { initProxy } from './proxy'
import { mergeOptions } from '../util/options'
import { initLifecycle } from './lifecycle'
export function initMixin(Vue) {
    //加载vue的时候初始化init函数
    console.log('始化init函数')
    Vue.prototype._init = function (options) {
        const vm = this
        if (options && options._isComponent) {
            //组件创建走这里
            initInternalComponent(vm, options)
            console.log('组件初始化调用的_init函数',vm.$options)
        } else {
            console.warn('以上是初始化一些最基本的方法，用于vue渲染----------------------------------------------------------------------------------------------------')
            //初始化vue调用init函数
            console.log('初始化vue调用init函数')
            //合并Vue.options._base与options合并
            vm.$options = mergeOptions(resolveConstructorOptions(vm.constructor), options || {}, vm);
            console.log('Vue.options._base与options合并',vm.$options)
        }
        //初始化vm._renderProxy = vm
        console.log("初始化vm._renderProxy = vm",vm)
        initProxy(vm)
        //初始化initLifecycle函数一些基本的参数
        console.log("初始化initLifecycle函数一些基本的参数",vm)
        initLifecycle(vm)
        //给vm添加 vm.$createElement render函数使用
        console.log("给vm添加 vm.$createElement render函数使用",vm)
        initRender(vm)
        if (vm.$options.el) {
            //有el
            console.log("vue有el直接调用 vm.$mount")
            vm.$mount(vm.$options.el)
        }
  }
}
export function initInternalComponent(vm, options) {
    const opts = vm.$options = Object.create(vm.constructor.options)
    const parentVnode = options._parentVnode
    //赋值vue实例
    opts.parent = options.parent
    //赋值组件VNode
    opts._parentVnode = parentVnode
    //vnodeComponentOptions = { Ctor, propsData, listeners, tag, children }
    const vnodeComponentOptions = parentVnode.componentOptions
    opts.propsData = vnodeComponentOptions.propsData
    opts._parentListeners = vnodeComponentOptions.listeners
    opts._renderChildren = vnodeComponentOptions.children
    opts._componentTag = vnodeComponentOptions.tag
}
export function resolveConstructorOptions(Ctor) {
    let options = Ctor.options;
    return options
}